
% Третья глава работы 
\chapter{Установка NAT}
\label{chap3}

\section{Ubuntu}
\label{chap3:sec1}

Здесь и далее будет полагаться, что к Интернету подключен интерфейс eth1 шлюза. При этом по eth0 подключены компьютеры внутренней сети. При этом не важен тип используемого соединения (Ethernet, Cable, Wi-Fi, DSL).

Базовая схема подключения выглядит следующим образом: PC-Client <---> PC-Gateway (Ubuntu) <---> Internet

\textbf{Настройка сетевой карты}

Сетевой карте, обслуживающей внутреннюю сеть (eth0), необходим статический IP--адрес.

Открываем сетевой конфигурационный файл:
\begin{verbatim}
gksu /etc/network/interfaces
\end{verbatim}
Правим настройки (приведенный вариант работает только для Ethernet--карт, для wireless необходимо иное)
\begin{verbatim}
auto eth0
iface eth0 inet static
        address 10.8.16.1
        netmask 255.255.255.0
        broadcast 10.8.16.0
        network 10.8.16.0
\end{verbatim}

Это установит статический IP--адрес для eth0 (10.8.16.1). Заметьте, что данная конфигурация вступит в силу после перезагрузки. При желании можно применить ее и без перезапуска командой
\begin{verbatim}
sudo ifconfig eth0 10.8.16.1
\end{verbatim}

\textbf{Включение переадресации портов}
По умолчанию в Ubuntu переадресация портов выключена. Для включения необходимо сделать следующее:
\begin{verbatim}
gsku gedit /etc/sysctl.conf
\end{verbatim}
и в открывшемся файле найти следующую строку:
\begin{verbatim}
#net.ipv4.conf.default.forwarding=1
\end{verbatim}
Снимите символ комментария (#):
\begin{verbatim}
net.ipv4.conf.default.forwarding=1
\end{verbatim}

Как и в случае с сетевой картой, изменения вступят в силу после перезагрузки. Применение конфигурации <<на лету>> возможно при помощи команды
\begin{verbatim}
sudo sysctl -w net.ipv4.ip_forward=1
\end{verbatim}

В некоторых случаях файл sysctl.conf игнорируется. Для того, чтобы проверить правильность настройки, введите команду
\begin{verbatim}
sudo sysctl net.ipv4.ip_forward
\end{verbatim} 
Если в качестве ответа появится <<0>>, то придется добавить в /etc/rc.local
\begin{verbatim}
sudo gedit /etc/rc.local
\end{verbatim}
до <<exit 0>> следующую строку:
\begin{verbatim}
sysctl -w net.ipv4.ip_forward=1
\end{verbatim}
Далее снова необходимо перезагрузиться.

\textbf{Конфигурация iptables (пакетного фильтра)}

Чтобы разрешить пакетам проходить через маршрутизатор, необходимо добавить несколько правил фильтрации в iptables. Также следует изменять сами пакеты, чтобы они могли вернуться к исходному отправителю. Открываем файл
\begin{verbatim}
gksu gedit /etc/rc.local
\end{verbatim}
и добавляем в него следующие строки:
\begin{verbatim}
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables --table nat -A POSTROUTING -o eth1 -j MASQUERADE
\end{verbatim}
Опять-таки изменения вступят в силу только после перезагрузки. Для моментального эффекта:
\begin{verbatim}
sudo iptables -P FORWARD ACCEPT
sudo iptables --table nat -A POSTROUTING -o eth1 -j MASQUERADE
\end{verbatim}

\textbf{Настройка клиентской машины}
Есть два варианта конфигурации клиента: статическая и динамическая. Для статической конфигурации клиентской машине надо присвоить IP--адрес 10.8.16.0/24 (то есть 10.8.16.2), шлюз 10.8.16.1 и DNS--сервер компьютера, с которого производится установка (/etc/resolv.conf)

Если же в сети присутствует большое количество клиентских машин, то можно установить простой DHCP--сервер на шлюзе, который будет отвечать за сетевую конфигурацию клиентов. С помощью команды
\begin{verbatim}
sudo apt-get install dhcp3-server
\end{verbatim}
следует поставить пакет для DHCP--сервера на шлюз. При попытке запуститься он выдаст ошибку, которую можно проигнорировать. Для конфигурации DHCP--сервера необходимо узнать еще кое-какую информацию, а именно адреса используемых DNS--серверов, чтобы в дальнейшем рпспределить их по клиентским машинам. С помощью команды
\begin{verbatim}
cat /etc/resolv.conf
\end{verbatim}
выводим на экран содержимое конфигурационного файла, из которого выделяем IP--адреса DNS--серверов. Теперь необходимо сконфигурировать DHCP--сервер. Для этого следует открыть файл /etc/dhcp3/dhcpd.conf:
\begin{verbatim}
gksu gedit /etc/dhcp3/dhcpd.conf
\end{verbatim}
и заменить его содержимое на
\begin{verbatim}
ddns-update-style none;
option domain-name <<mynetwork>>;
option domain-name-servers Nameserver1, Nameserver2;
option routers 10.8.16.1;

default-lease-time 42300;
max-lease-time 84600;
authoritative;

log-facility local7;

subnet 10.8.16.0 netmask 255.255.255.0 {
  range 10.8.16.50 10.8.16.150;
}
\end{verbatim}
При этом вместо Nameserver1, Nameserver2 надо подставить те самые IP--адреса, которые были получены из /etc/resolv.conf. Остается определить интерфейс. Откройте файл:
\begin{verbatim}
gksu gedit /etc/default/dhcp3-server
\end{verbatim}
и замените строку INTERFACES="" на
\begin{verbatim}
INTERFACES="eth0"
\end{verbatim}
После этого можно запустить DHCP--сервер командой
\begin{verbatim}
sudo /etc/init.d/dhcp3-server start
\end{verbatim}
Сервер работает.\cite{lit5}

\section{Windows}
\label{chap3:sec2}

\textbf{Настройка сервера}

В Windows XP professional или Windows 2000 professional для доступа к Интернету из внутренней сети используется служба Internet Connection Sharing (далее ICS), или <<Общий доступ к подключению Интернета>>. Эта служба осуществляет поддержку DNS и DHCP (поддержка DHCP происходит только для диапазона адресов 192.168.0.0/24) . Далее рассмотрим настройку сервера по шагам:
\begin{enumerate}
\item Пуск / Настройка/ Сетевые подключения/ (Start / settings / Network connections)Там необходимо выбрать подключение настроенное на Интернет. Если подключение происходит через VPN, то и настраивать общий доступ нужно именно в нем, а не в сетевом подключении.
\item В свойствах подключения во вкладке <<Общие>> есть различные компоненты. Необходимо отключить: <<Клиент для сетей Microsoft>> и <<Службу доступа к файлам и принтерам сетей Microsoft>>. 
\item Во вкладке <<Дополнительно>> (в Windows 2000 professional  вкладка <<Общий доступ>>) запускается служба ICS. (При установленной Windows XP professional SP2 рекомендуется отключить Брандмауэр Windows, в Traffic Inspector для защиты есть сетевой экран (firewall) и вместе они усложнят дальнейшую настройку). Заходим в <<Параметры>>.
\item Надо установить галку <<Разрешить другим пользователям сети использовать подключение к Интернет данного компьютера>>, и снять галку с <<Разрешить другим пользователям сети управлять общим доступом подключения к Интернету>>. Далее --- <<ОК>>. На предупреждение --- тоже <<ОК>>.
\end{enumerate}

\textbf{Настройка клиентской машины}

По умолчанию Windows присваивает внутреннему интерфейсу сервера IP адрес 192.168.0.1, поэтому настраивать клиентские машины можно в диапазоне IP адресов от 192.168.0.2 до 192.168.0.254. 
\begin{enumerate}
\item Пуск / Настройка/ Сетевые подключения/ (Start / settings / Network connections). Надо выбрать подключение, настроенное на локальную сеть. В свойствах этого подключения необходимо выбрать <<Протокол Интернета TCP/IP>>.
\item <<IP-адрес>> - это адрес клиентской машины, который лежит в диапазоне (диапазон адресов зависит от IP адреса сервера) от 192.168.0.2-192.168.0.254  т.е. любой из этих адресов может быть указан (главное чтобы они не повторялись). <<Маска подсети>> --- это еще один идентификатор сети выставляется он автоматически. Главное, чтобы на всех машинах он был одинаковым. <<Основной шлюз>> и <<Предпочитаемый DNS-сервер>> --- здесь указывается IP адрес внутреннего интерфейса сервера (192.168.0.1). Для остальных клиентских машин все настройки те же, меняется только собственный IP адрес.
\end{enumerate}

Настройку клиентских машин можно произвести автоматически, для этого на клиентских машинах  выставите <<Получить IP адрес автоматически>> и <<Получить адрес DNS сервера автоматически>>.

\textbf{Проверка настройки}
Для проверки правильности настройки NAT используется <<Командная строкя>>. Проверку осуществляют на одной клиентской машине(если есть необходимость, можно проверять на всех).
\begin{enumerate}

\item ЗАПУСТИТЬ и надо набрать \begin{verbatim}cmd\end{verbatim} 
\item Пропингуем сначала сервер, находящийся по адресу 192.168.0.1, для этогонеобходимо набрать команду 
\begin{verbatim}ping 192.168.0.1\end{verbatim}. Если пинг прошел, то локальная сеть работает без проблем. Если ответа не произошло: пишет <<Превышен интервал ожидания для запроса>> или <<Заданный узел не доступен>>, тогда надо проверить, лежит ли IP адрес клиента в диапазоне адресов 192.168.0.2-192.168.0.254, что маска подсети у всех одинакова по умолчанию 255.255.255.0, и конечно --- целостность физического подключения.
\item Далее надо пропинговать внешний интерфейс сервера, для этого мы должны знать его адрес. Хорошо если адрес постоянный и он известен знаете, но если нет, то его можно узнать, набрав в командной строке на сервере  \begin{verbatim}ipconfig /all\end{verbatim}. 
\item После этого  можно пропинговать внешний интерфейс сервера. На клиентской машине в командной строке необходимо набрать \begin{verbatim}ping xxx.xxx.xxx.xxx\end{verbatim} где xxx.xxx.xxx.xxx узнанный адрес. Пусть это будет 10.1.1.50. Если все прошло, то связь с внешним интерфейсом установлена. Если ответа не произошло пишет <<Превышен интервал ожидания для запроса>> или <<Заданный узел не доступен>>, тогда необходимо проверить правильность настроек клиента.
\item Далее надо пингануть адрес находящийся в Интернете, например mail.ru. Если пинг проходит, то все настройки верны и на клиентской машине уже есть доступ в Интернет. Если пишет <<mail.ru: неизвестный узел>>, значит неправильно настроен DNS сервер, необходимо проверить настройки у клиентских машин. Если пишет <<Превышен интервал ожидания для запроса.>>, то следует повторить эту проверку на сервере и убедится в правильности настроек подключения к Интернет.

\end{enumerate}
\cite{lit6}

\section{OpenBSD}
\label{chap3:sec3}
%правило
Основной формат правил NAT в pf.conf выглядит следующим образом: 
\begin{verbatim}
nat [pass] [log] on interface [af] from src_addr [port src_port] 
\end{verbatim}
\begin{verbatim}
to dst_addr [port dst_port] -> ext_addr [pool_type] [static-port] 
\end{verbatim}
% таблица с пояснениями
\begin{longtable}{p{0.2\textwidth}p{0.7\textwidth}}
Команда & Значение \\
nat  & ключевое слово, с которого начинается правило NAT \\
pass & преобразованные пакеты не будут обрабатываются правилами фильтрации \\
log & логировать пакеты с помощью pflogd. Обычно только первый пакет заносится в журнал. Для логирования всех пакетов используйте log (all). \\
interface & Название интерфейса, или группы интерфейсов на котором будут проводиться преобразования. \\
af & Семейство адресов, inet для IPv4 или inet6 для IPv6. PF как правило в сам в состоянии определить этот параметр c помощью исходных адресов и адресов назначения. \\
src\_addr & Исходные (внутренние) адреса пакетов, которые будут преобразованы. Исходные адреса могут быть указаны, как: 
\begin{itemize}
\item Единственный IPv4 или IPv6 адрес. 
\item Сетевой блок CIDR 
\item Полное доменное имя, которое будет преобразовано через DNS сервер при загрузке правила. Полученные адреса окажутся в правиле. 
\item Название сетевого интерфейса или группы сетевых интерфейсов. Любые IP адреса принадлежащие интерфейсу будут подставлены в правило, во время загрузки. 
\item Название сетевого интерфейса сопровождающегося /netmask (например, /24). Каждый IP адрес на интерфейсе, совмещённый с сетевой маской, образует блок CIDR и оказывается в правиле. 
\item Название сетевого интерфейса или группы сетевых интерфейсов, сопровождающихся модификаторами: 
\begin{itemize}
\item :network - заменяется сетевым блоком CIDR (например, 192.168.0.0/24) 
\item :broadcast - заменяется широковещательным адресом сети (например, 192.168.0.255) 
\item :peer - заменяется peer IP -- адресом другой стороны point-to-point линка 
\end{itemize}
\end{itemize} \\
src\_port & Исходный порт в заголовке пакета. Порты могут быть указаны, как: 
\begin{itemize}
\item Номер от 1 до 65535 
\item Актуальное название сервиса смотрите в /etc/services 
\item Набор портов, используя списки 
\item Диапазон: 
\begin{itemize}
\item != (не равно) 
\item < (меньше) 
\item > (больше) 
\item <= (меньше или равно) 
\item >= (больше или равно) 
\item >< (диапазон) 
\item <> (обратный диапазон) 
\end{itemize} 
\end{itemize}
Последние два бинарных оператора (они используют два аргумента) не включают аргументы в этот диапазон 
: (включающий диапазон) 
Включающий диапазон, также бинарные операторы и включают аргументы в диапазон. 
Опция port не часто используется в nat правилах, потому что обычно стоит задача преобразовывать весь трафик, не зависимо от используемых портов. \\

dst\_addr  & Адрес назначения преобразуемых пакетов. Адрес назначения указывается так же, как и исходный адрес.  \\
dst\_port & Порт назначения. Порт указывается так же, как и исходный порт.  \\
ext\_addr  & Внешний (преобразуемый) адрес на NAT шлюзе, в который будут пробразованы пакеты. Внешний адрес может быть указан как: 
\begin{itemize}
\item Единственный IPv4 или IPv6 адрес. 
\item Сетевой блок CIDR 
\item Полное доменное имя, которое будет преобразовано через DNS сервер при загрузке правила. Полученные адреса окажутся в правиле. 
\item Название сетевого интерфейса. Любые IP адреса принадлежащие интерфейсу будут подставлены в правило, во время загрузки. 
\item Название сетевого интерфейса указанного в круглых скобках ( ). Это говорит PF обновлять правило, если IP адрес(а) на указанном интерфейсе сменился. Полезно на интерфейсах, которые получают IP адреса по DHCP или используют dial-up, чтобы каждый раз при смене адреса не перегружать правила. 
\item Название сетевого интерфейса, сопровождающееся одним из этих модификаторов: 
\begin{itemize}
\item :network - заменяется сетевым блоком CIDR (например, 192.168.0.0/24) 
\item :peer - заменяется peer IP адресом другой стороны point-to-point линка 
\end{itemize}
\end{itemize}
Кроме того, модификатор :0 может быть добавлен к любому интерфейсу или к любому из вышеуказанных модификаторов, для указания, что PF не должен задействовать alias IP адреса. Этот модификатор может использоваться при указании интерфейса в круглых скобках. Пример: fxp0:network:0 
Ряд адресов, используя список. \\
pool\_type & Указывается тип диапазона адресов используемого для трансляции. \\
static-port & Не преобразовывать исходные порты в TCP и UDP пакетах. \\
\end{longtable}


Как правило, для большинства случаев подойдёт следующее: 
\begin{verbatim}
nat on tl0 from 192.168.1.0/24 to any -> 24.5.0.5
\end{verbatim}
Эти правила говорят выполнять NAT на интерфейсе tl0 для любых входящих пакетов из 192.168.1.0/24 и заменять исходный IP адрес на 24.5.0.5. 
Вышеуказанное правило является корректны однако лучше использовать:
\begin{verbatim} nat on tl0 from dc0:network to any -> tl0  \end{verbatim}. 
Это объясняется тем, что есть возможность поменять IP адреса на любом интерфейсе без изменения правила. 
Когда указывается название интерфейса для трансляции адресов, как в примере выше, то IP адрес определяется в pf.conf во время загрузки, а не на <<лету>>. Если используется DHCP для настройки внешних интерфейсов, это может оказаться проблемой. Если присваиваемые IP адреса меняются, NAT будет продолжать преобразовывать исходящие пакеты используя старый IP адрес. Это приведёт к остановке функционирования исходящих соединений. Чтобы этого избежать,  можно сделать так, что бы PF автоматически обновлять преобразуемый адрес, указав круглые скобки вокруг названия интерфейса: 
nat on tl0 from dc0:network to any -> (tl0) 
Этот метод работает для преобразования IPv4 и IPv6 адресов. 

\textbf{Двунаправленное отображение (отображение 1:1)}
Двунаправленное отображение может быть установлено использованием правила binat. Правило binat устанавливает один к одному отображение между внутренним IP адресом и внешним. Это может быть полезно, например, для предоставления веб сервера во внутренней сети со своим личным внешним IP адресом. Соединения из Интернета на внешний адрес будут транслироваться на внутренний адрес а соединения от веб сервера (такие как DNS запрос) будут преобразовываться во внешний адрес. TCP и UDP порты никогда не изменяются с binat правилом. 
\begin{verbatim}
binat on tl0 from \$web\_serv\_int to any -> \$web\_serv\_ext
\end{verbatim}

\textbf{Исключения правил трансляции}
Исключения в правилах трансляции могут быть сделаны используя ключевое слово no. Например, если изменить пример указанный выше, то он будет выглядеть так: 
\begin{verbatim}
no nat on tl0 from 192.168.1.208 to any
nat on tl0 from 192.168.1.0/24 to any -> 24.2.74.79 
\end{verbatim}
Тогда указанная сеть 192.168.1.0/24 будет транслироваться через внешний адрес 24.2.74.79, за исключением адреса 192.168.1.208. 
Если существует ключевое слово no тогда пакеты не транслируются. Ключевое слово no так же может быть использовано с binat и rdr правилами. 

\textbf{Проверка NAT статуса}
Для просмотра активных NAT трансляций используется pfctl с опцией -s state. Эта опция выведет список всех текущих NAT сессий: 
\begin{verbatim}
# pfctl -s state
fxp0 TCP 192.168.1.35:2132 -> 24.5.0.5:53136 -> 65.42.33.245:22 
\end{verbatim}
\begin{verbatim}TIME_WAIT:TIME_WAIT \end{verbatim}
fxp0 UDP 192.168.1.35:2491 -> 24.5.0.5:60527 -> 24.2.68.33:53 
\begin{verbatim}MULTIPLE:SINGLE\end{verbatim}

\begin{longtable}{p{0.2\textwidth}p{0.7\textwidth}}
Запись & Пояснение\\
fxp0 & Отображает интерфейс к которому привязан стейт. Слово self будет отображаться если стейт плавающий floating. \\
TCP & используемый соединением протокол. \\
192.168.1.35: 2132  & IP адрес (192.168.1.35) машины во внутренней сети. Исходный порт (2132) показан после адреса. Также адрес, который находится в IP заголовке. \\
24.5.0.5:53136 & IP адрес (24.5.0.5) и порт (53136) на шлюзе, в который будут транслированы пакеты. \\
65.42.33.245:22 & IP адрес (65.42.33.245) и порт (22) к которому внутренняя машина соединяется. \\
TIME\_WAIT: TIME\_WAIT & Показывает в каком состоянии прибывает TCP соединение \\
\end{longtable}
\cite{lit2}

\section{Cisco 827}
\label{chap3:sec4}

В данном документе мы рассмотрим пример, в котором интернет--провайдер (Internet Service Provider, ISP) выделил DSL абоненту единственный IP адрес из подсети 171.68.1.1/24. Выделенный IP адрес будет уникальным (в данной подсети – естественно для предотвращения конфликтов) и он «обозначается» как внутренний глобальный адрес.
Данный адрес будет использоваться клиентами внутренней подсети для доступа к Интернет, а так же для того, чтобы клиенты внешней сети (Интернет) могли получить доступ извне к внутреннему Web--серверу. Внутренняя (приватная) подсеть 192.168.0.0/24 подключена к NAT маршрутизатору. В данной подсети есть несколько ПК и Web сервер. NAT маршрутизатор настроен таким образом, что клиенты внутренней подсети (с приватными IP адресами) могут получать доступ к Интернету через один внешний IP адрес (inside global - 171.68.1.1). IP адрес Web сервера 192.168.0.5. Данный адрес «не виден» из Интернета. Для внешних клиентов (которые обращаются к Web серверу) доступен единственный IP адрес 171.68.1.1. Маршрутизатор NAT также настроен для «проброса» запросов от внешних клиентов на 80 порт IP адреса 171.68.1.1 на 80 порт внутреннего IP адреса нашего сервера (в данном случае это 192.168.0.5). Таким образом, внешние клиенты, подключаясь к нашему Web серверу (внешнему IP адресу), будут перенаправлены (прозрачно) на внутренний сервер. При написании данного документа использовалось следующее оборудование: Cisco 827, которое выступало в роли маршрутизатора.
\textbf{здесь будет рисунок}
\begin{verbatim}
Current Configuration:
  !
  version 12.1
  service timestamps debug uptime
  service timestamps log uptime
  !
  hostname 827
  !
  ip subnet-zero
  no ip domain-lookup
  !
  bridge irb
  !
  interface Ethernet0
  ip address 192.168.0.254 255.255.255.0
  ip nat inside
!--- Внутренний интерфейс с внутренним приватным IP адресом.
  !
  interface ATM0
  no ip address
  no atm ilmi-keepalive
  pvc 0/35
  encapsulation aal5snap
  !
  bundle-enable
  dsl operating-mode auto
  bridge-group 1
  !
  interface BVI1
  ip address 171.68.1.1 255.255.255.240
  ip nat outside
!--- Внешний интерфейс. Вместо указанного IP адреса Вам необходимо указать внешний IP, который выдал провайдер.
 !
 ip nat inside source list 1 interface BVI1 overload
!--- Данной командой мы включаем PAT для клиентов определённых в первом (с номером 1) списке.
ip nat inside source static tcp 192.168.0.5 80 171.68.1.1 80
extendable
!--- Задействуем трансляцию портов. В данном примере все запросы от внешних клиентов на IP адрес 171.68.1.1 с портом 80 будут перенаправлены на IP адрес 192.168.0.5 с портом 80.
ip classless
ip route 0.0.0.0 0.0.0.0 171.68.1.254
!--- IP адрес 171.68.1.254 – это шлюз по умолчанию для нашего маршрутизатора.
 !
 access-list 1 permit 192.168.0.0 0.0.0.255
!--- Данным списком доступа мы определяем диапазон приватной подсети, который будет использоваться в механизмах трансляции сетевых адресов (NAT).
 bridge 1 protocol ieee
 bridge 1 route ip
 !
 end
\end{verbatim}
   Проверка
   Для проверки используйте команду show ip nat translation для про-
смотра статистики сетевой трансляции. Рассмотрим пример:
\begin{verbatim}
827#
827#show ip nat translation
Pro Inside global     Inside local     Outside local        Outside globa
tcp 171.68.1.1:80        192.168.0.5:80    ---                   ---
tcp 171.68.1.1:80      192.168.0.5:80 198.133.219.1:11000 198.133.2
827#
\end{verbatim}
В данном примере внешний клиент с IP адресом 198.133.219.1 подключился к нашему мартутизатору на внешний IP 171.68.1.1 порт 80 и согласно механизмам PAT был «прозрачно» перенаправлен на внутренний IP адрес 192.168.0.5 порт 80.


%%% Local Variables:
%%% mode: latex
%%% coding: utf-8-unix
%%% TeX-master: "../default"
%%% End:
